//6.5 - Tic Tac Toe - Dirk Henkemans and Mark Lee //Prima Publishing #include #include using namespace std; //introduces namespace std enum SquareState { blank = ' ', X = 'X', O='O'}; class gameBoard { private: const int WIDTH; const int HEIGHT; int* GB; public: gameBoard() : WIDTH(3), HEIGHT(3) { GB = new int[9]; for (int i = 0; i < 9; i++) *(GB + i) = blank; } ~gameBoard() {delete[] GB;} void setX(int h, int w); void setO(int h, int w); bool isTaken(int h, int w); SquareState isLine(); void draw(); }; void gameBoard::setX(int h, int w) { *(GB + h*HEIGHT + w) = X; } void gameBoard::setO(int h, int w) { *(GB + h*HEIGHT + w) = O; } bool gameBoard::isTaken (int h, int w) { return *(GB + h*HEIGHT + w) != ' '; } SquareState gameBoard::isLine() { if(*GB==X && *(GB +1)==X && *(GB +2)==X) return X; if(*GB==O && *(GB +1)==O && *(GB +2)==O) return O; if(*(GB +3)==X && *(GB +4)==X && *(GB +5)==X) return X; if(*(GB +3)==O && *(GB +4)==O && *(GB +5)==O) return O; if(*(GB +6)==X && *(GB +7)==X && *(GB +8)==X) return X; if(*(GB +6)==O && *(GB +7)==O && *(GB +8)==O) return O; if(*GB==X && *(GB +3)==X && *(GB +6)==X) return X; if(*GB==O && *(GB +3)==O && *(GB +6)==O) return O; if(*(GB +1)==X && *(GB +4)==X && *(GB +7)==X) return X; if(*(GB +1)==O && *(GB +4)==O && *(GB +7)==O) return O; if(*(GB+2)==X && *(GB+5)==X && *(GB+8)==X) return X; if(*(GB+2)==O && *(GB +5)==O && *(GB +8)==O) return O; if(*GB==X && *(GB +4)==X && *(GB +8)==X) return X; if(*GB==O && *(GB +4)==O && *(GB +8)==O) return O; if(*(GB +2)==X && *(GB +4)==X && *(GB +6)==X) return X; if(*(GB +2)==O && *(GB +4)==O && *(GB +6)==O) return O; return blank; } void gameBoard::draw() { cout << endl; for(int i=0; i < HEIGHT; i++) { cout << (char)*(GB + i*HEIGHT); for(int c=1; c < WIDTH; c++) cout << " | " << (char)*(GB + i*WIDTH + c); cout << endl << "-----------" << endl; } } class Game { public: gameBoard* doInput(string player, gameBoard* gb); bool inRange(int test); }; gameBoard* Game::doInput(string player, gameBoard* gb) { gb->draw(); string letter; if (player.compare("one") == 0) letter = "X"; else if (player.compare("two") == 0) letter = "O"; else return gb; int input1, input2; do { do { cout << "\nPlayer " << player.c_str() << ", please enter a row number to put an " << letter.c_str() << ": "; cin >> input1; }while(!inRange(input1)); do { cout << "\nPlease enter a column number to put an " << letter.c_str() << ": "; cin >> input2; }while(!inRange(input2)); }while (gb->isTaken(input1,input2)); if (player.compare("one") == 0) gb->setX(input1, input2); else gb->setO(input1, input2); return gb; } bool Game::inRange(int test) { return test > -1 && test < 3; } int main( void ) { gameBoard* gb = new gameBoard; Game g; string player1, player2; cout << "Welcome to Tic Tac Toe!" << "\nPlayer one, please enter your name: "; cin >> player1; cout << "\nPlayer two, please enter your name: "; cin >> player2; while (gb->isLine() == ' ') { gb = g.doInput("one",gb); gb = g.doInput("two",gb); } gb->draw(); if(gb->isLine() == X) cout << "\nPlayer one, you win!" << "\nGame Over."; else cout << "\nPlayer two, you win!" << "\nGame Over."; return 0; }